package safari.model.common;
/**
 * 페이징 처리를 위한 비즈니스 클래스
 */
public class PagingBean {
	/**
	 *  현재 페이지
	 */
	private int nowPage=1;
	/**
	 * 페이지당 보여줄 게시물 수
	 */
	private int numberOfContentsPerPage=CommonConstants.CONTENT_NUMBER_PER_PAGE;
	/**
	 * 페이지 그룹당 페이지 수
	 */
	private int numberOfPageGroup=CommonConstants.PAGEGROUP_NUMBER_PER_PAGE;
	/**
	 * 현재 db에 저장된 총 게시물 수
	 */
	private int totalContents;
	/**
	 * db로 부터 전체 게시물 수를 받아오고, 현제 페에지는 client 로부터 받아 생성
	 * @param totalContents
	 * @param nowPage
	 */
	
	public PagingBean(int totalContents, int nowPage){
		this.totalContents=totalContents;
		this.nowPage=nowPage;
	}
	/**
	 * db로 부터 게시물 수 받아오고, 첫페이지로 설정
	 */
	public PagingBean(int totalContents){
		this.totalContents=totalContents;
	}
	/**
	 * 현재 페이지를 리턴
	 * @return
	 */
	public int getNowPage(){
		  return nowPage;
		 }
	/**
	   * 총 페이지 수를 return한다.
	        1. 전체 데이터(게시물) % 한 페이지에 보여줄 데이터 개수 
	            => 0 이면 둘을 / 값이 총 페이지 수
	        2. 전체 데이터(게시물) % 한 페이지에 보여줄 데이터 개수 
	            => 0보다 크면 둘을 / 값에 +1을 한 값이 총 페이지 수
	          게시물수 1 2 3 4 5 6 7 8 9 10 11 12
	          1페이지 1~5
	          2페이지 6~10
	          3페이지 11          
	          ex) 게시물 32 개 , 페이지당 게시물수 5개 
	               -> 7 페이지 
	   * @return
	   */
	
	  public int getTotalPage(){
	   int totalPage=0;
	   if(totalContents%numberOfContentsPerPage==0){
	    totalPage=totalContents/numberOfContentsPerPage;
	   }else{
	    totalPage=(totalContents/numberOfContentsPerPage)+1;
	   }
	   return totalPage;
	  }
	  /**
	   * 총 페이지 그룹의 수를 return한다.
	   1. 총 페이지수 % Page Group 내 Page 수. 
	        => 0 이면 둘을 / 값이 총 페이지 수
	   2. 총 페이지수 % Page Group 내 Page 수. 
	   => 0보다 크면 둘을 / 값에 +1을 한 값이 총 페이지 수
	   ex) 총 게시물 수 23 개 
	    총 페이지 ?  총 페이지 그룹수 ? 
	    페이지 1 2 3 4 5
	    페이지그룹 1234(1그룹)   5(2그룹) 
	   * @return
	   */
	  public int getTotalPageGroup(){
	   int totalPage=getTotalPage();
	   int totalPageGroup=0;
	   if(totalPage%numberOfPageGroup==0){
	    totalPageGroup=totalPage/numberOfPageGroup;
	   }else{
	    totalPageGroup=(totalPage/numberOfPageGroup)+1;
	   }
	   return totalPageGroup;
	  }
	  /**
	   * 현재 페이지가 속한 페이지 그룹 번호(몇 번째 페이지 그룹인지) 을
	   *  return 하는 메소드 
	   *  1. 현재 페이지 % Page Group 내 Page 수 => 0 이면 
	   *      둘을 / 값이 현재 페이지 그룹. 
	   *  2. 현재 페이지 % Page Group 내 Page 수 => 0 크면 
	   *      둘을 / 값에 +1을 한 값이 현재 페이지 그룹
	   *      1 2 3 4 5 6 7 8 9 10
	   * @return
	   */
	  public int getNowPageGroup(){
	   int nowPageGroup=0;
	   if(nowPage%numberOfPageGroup==0){
	    nowPageGroup=nowPage/numberOfPageGroup;
	   }else{
	    nowPageGroup=(nowPage/numberOfPageGroup)+1;

	   }
	   return nowPageGroup;
	  }
	  /**
	   * 현재 페이지가 속한 페이지 그룹의 시작 페이지 번호를 return 한다.
	        1. Page Group 내 Page 수*(현재 페이지 그룹 -1) + 1을 한 값이 첫 페이지이다.
	            (페이지 그룹*페이지 그룹 개수 이 그 그룹의 마지막 번호이므로) 
	       2. 위의 계산 결과가 0인 경우는 첫페이지 이므로 1을 return 한다.
	       페이지 그룹 
	       1 2 3 4 -> 5 6 7 8 -> 9 10 
	   * @return
	   */
	  public int getStartPageOfPageGroup(){
	   return numberOfPageGroup*(getNowPageGroup()-1)+1;
	  }
	  /**
	   * 현재 페이지가 속한 페이지 그룹의 마지막 페이지 번호를 return 한다.
	        1. 현재 페이지 그룹 * 페이지 그룹 개수 가 마지막 번호이다. 
	        2. 그 그룹의 마지막 페이지 번호가 전체 페이지의 마지막 페이지 번호보다 
	            큰 경우는 전체 페이지의 마지막 번호를 return 한다.
	        1 2 3 4 -> 5 6 7 8 -> 9 10     
	   * @return
	   */
	  public int getEndPageOfPageGroup(){
	   int totalPage=getTotalPage();
	   int endPageOfPageGroup= getNowPageGroup()*4;
	    if(endPageOfPageGroup>totalPage){
	    endPageOfPageGroup= totalPage;
	    }
	   return endPageOfPageGroup;
	  }
	  /**
	   * 이전 페이지 그룹이 있는지 체크하는 메서드 
	   * 현재 페이지가 속한 페이지 그룹이 1보다 크면 true
	   * ex )  페이지  
	   *   1 2 3 4 / 5 6 7 8 / 9 10 
	   *       1        2           3 group
	   * @return
	   */
	  public boolean isPreviousPageGroup(){
	  boolean isPreviousPageGroup=false;
	   if(getNowPageGroup()>1)
	    isPreviousPageGroup=true;
	   return isPreviousPageGroup;
	  }
	  /**
	   * 다음 페이지 그룹이 있는지 체크하는 메서드 
	   * 현재 페이지 그룹이 마지막 페이지 그룹(
	   * 마지막 페이지 그룹 == 총 페이지 그룹 수) 보다 작으면 true
	   *  * ex )  페이지  
	   *   1 2 3 4 / 5 6 7 8 / 9 10 
	   *       1        2           3 group
	   * @return
	   */
	  public boolean isNextPageGroup(){
	   boolean isNextPageGroup=false;
	   if(getNowPageGroup()<getTotalPageGroup()){
	    isNextPageGroup=true;
	   }
	   return isNextPageGroup;
	  }
	  public static void main(String args[]){
	   PagingBean p=new PagingBean(47);
	   System.out.println(p.getTotalPage());
	   System.out.println(p.getTotalPageGroup());
	   PagingBean p1 = new PagingBean(34, 6);
	   System.out.println(p1.getNowPageGroup());
	   System.out.println(p1.getStartPageOfPageGroup());
	   System.out.println(p1.getEndPageOfPageGroup());
	   System.out.println(p1.isNextPageGroup());
	  }
}